/**
 * @file Cmd.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 指令类
 */

#ifndef __CMD_H__
#define __CMD_H__

/**
 * @brief 指令
 */
class Cmd {
public:
    enum cmdType { // 指令类型
        NOP = 0, // 空指令
        RUN_TO = 1, // 抵达
        BUY = 2, // 购买
        SELL = 3, // 出售
        DESTROY = 4, // 销毁
        WAIT = 5, // 等待
        AVOID = 6, // 避让
    };
    cmdType type; // 指令类型
    int data1; // 抵达指令的横坐标/出售指令的货物类型/等待指令的等待时间
    int data2; // 抵达指令的纵坐标
    int data3; // 抵达指令的移动方向
    void *ptr; // 购买指令的工作台/出售指令的工作台/躲避指令的规划器

public:
    Cmd(cmdType type = NOP, int data1 = 0, int data2 = 0, int data3 = 0, void *ptr = nullptr) :
        type(type), data1(data1), data2(data2), data3(data3), ptr(ptr) {}
    Cmd(cmdType type, void *ptr) :
        type(type), data1(0), data2(0), data3(0), ptr(ptr) {}
    static Cmd createRunTo(int x, int y, int dir, bool isEmpty);
    static Cmd createBuy(void *bench);
    static Cmd createSell(void *bench, int type);
    static Cmd createDestroy();
    static Cmd createWait(int waitFrames);
    static Cmd createAvoid(int x, int y, void *dispatcher, int minSteps);
    bool operator==(const Cmd &another);
    bool operator!=(const Cmd &another);
};

#endif
